// 对象转换成 查询字符串
function querystringify(obj) {
    let str = ''
    for (let k in obj) {
      // str += 'name' + '=' + 'jack' + '&'
      // str += 'age' + '=' + '18' + '&'
      str += k + '=' + obj[k] + '&'
    }
  
    // str === 'name=jack&age=18&'
    return str.slice(0, -1)
  }


function ajax (options = {}){
    //1.判断地址
    if(!(options.url)){
        throw new Error('ulr是必填选项')//手动报错
    }
    //2.判断请求方式
    if(!(options.method ===undefined || /^(get|post)$/i.test(options.method))){
        throw new Error('method现在只能是get或者post')
    }
    //3.判断同步异步
    if(!(options.asyns === undefined || typeof options.asyns === 'boolean')){
        throw new Error('同步异步只可以是布尔值')
    }
    //4.判断是否携带参数
    if(!(options.data  === undefined || typeof options.data === 'string')){
        throw new Error('需要携带一个string字符串参数')
    }
    //5.判断请求头
    if(!(options.headers === undefined || Object.prototype.toString.call(options.headers) === '[object Object]')){
        throw new Error('请求头必须是一个对象')
    }
    //6.判断解析体
    if(!(options.dataType === undefined || /^(string|json)$/i.test(options.dataType))){
        throw new Error('解析体既不是json也不是string')
    }
    //7.判断成功后的回调函数
    if(!(options.success === undefined || typeof options.success === 'function')){
        throw new Error('success需要传递一个函数')
    }



    //准备一套默认值
    const _default = {
        url: options.url,
        method: options.method || 'GET',
        asyns: options.asyns ?? true,
        data: options.data || '',
        headers: { 'content-type': 'application/x-www-form-urlencoded', ...options.headers },
        dataType:options.dataType || 'string',
        success:options.success || function(){}

    }


    //设置如果是get请求并且携带参数直接在后面加参数
    if(/^get$/i.test(_default.method) && _default.data){
        _default.url += '?' + _default.data
    }



    //发送ajax
    const xhr = new XMLHttpRequest()
    xhr.open(_default.method,_default.url,_default.asyns)
    xhr.onload=()=>{
        let res = xhr.responseText
        if(_default.dataType === 'json'){
            res =JSON.parse (xhr.responseText)
        }
        _default.success(res)

    }
    for(let k in _default.headers){
        xhr.setRequestHeader(k,_default.headers[k])
    }
    if(/^get$/i.test(_default.method)){
        xhr.send()
    }else{
        xhr.send(_default.data)
    }
}

